/**
 * 统一的API请求工具，自动添加认证头
 * 1。 这里学到了自定义hook和普通函数的区别，如果不依赖React、useState等，可以在任意js文件中使用，就是普通函数，否则就是自定义hook
 *  反之，如果使用了React的hook（如useState），则必须在组件中使用，或者在自定义hook中调用。就是自定义hook。
 * 2. 这里使用的是localStorage来存储token，所以不需要使用useContext获取，如果使用了context，则需要定义成自定义hook，然后在组件中使用。
 */

const API_BASE_URL = 'http://localhost:8080/api';

// 自定义fetch封装
export const authFetch = async (url: string, options: RequestInit = {}) => {
  // 获取token
  const token = localStorage.getItem('authToken');

  // 准备请求头
  const headers = new Headers(options.headers);
  headers.set('Content-Type', 'application/json');

  // 如果存在token，添加Authorization头
  if (token) {
    headers.set('Authorization', `Bearer ${token}`);
  }

  // 合并选项
  const mergedOptions: RequestInit = {
    ...options,
    headers,
  };

  try {
    const response = await fetch(url, mergedOptions);

    // 检查认证状态
    if (response.status === 401) {
      // token过期或无效，清除本地存储
      localStorage.removeItem('authToken');
      localStorage.removeItem('userInfo');
      localStorage.removeItem('authTokenExpiry');

      // 只有在当前不是登录页时才跳转，避免循环跳转
      if (!window.location.pathname.includes('/login')) {
        window.location.href = '/login';
      }
      throw new Error('认证已过期，请重新登录');
    }

    return response;
  } catch (error) {
    console.error('API请求错误:', error);
    throw error;
  }
};

// 用户相关接口（使用authFetch）
export const USER_API = {
  LOGIN:      `${API_BASE_URL}/auth/login`,
  REGISTER:   `${API_BASE_URL}/auth/register`,
  PAGE:       `${API_BASE_URL}/user/page`,
  DETAIL:     (id: number) => `${API_BASE_URL}/user/${id}`,
  CREATE:     `${API_BASE_URL}/user/create`,
  UPDATE:     `${API_BASE_URL}/user/update`,
  DELETE:     (id: number) => `${API_BASE_URL}/user/logicDelete/${id}`,
};

export const ROLE_API = {
  PAGE:       `${API_BASE_URL}/role/page`,
  DETAIL:     (id: number) => `${API_BASE_URL}/role/detail/${id}`,
  CREATE:     `${API_BASE_URL}/role/create`,
  UPDATE:     `${API_BASE_URL}/role/update`,
  DELETE:     (id: number) => `${API_BASE_URL}/role/logicDelete/${id}`,
  RECOVER:    (id: number) => `${API_BASE_URL}/role/recover/${id}`,
  ALL:        `${API_BASE_URL}/role/all`,
};

export default API_BASE_URL;